package com.github.yeecode.mybatisdemo;

import com.github.yeecode.mybatisdemo.service.Singable;
import com.github.yeecode.mybatisdemo.service.impl.Singer;
import javassist.util.proxy.MethodHandler;
import javassist.util.proxy.ProxyFactory;
import javassist.util.proxy.ProxyObject;

import java.lang.reflect.Method;

/**
 * @author : wushikai
 * <p>
 * date : 2021-01-30
 */

public class JavassistProxyDemo {

    public static void main(String[] args) throws Exception {
        ProxyFactory proxyFactory = new ProxyFactory();
        proxyFactory.setSuperclass(Singer.class);// 设置父类
        Class<?> clazz = proxyFactory.createClass(); //生产一个代理类对象
        Singable proxy   = (Singable) clazz.getDeclaredConstructor().newInstance(); //这个类对象直接通过构造器直接生成代理对象;
        ((ProxyObject) proxy).setHandler(new JavassistInterceptor());
        proxy.sing();


    }



    private static class JavassistInterceptor implements MethodHandler {

        /**
         * @param self    创建的代理对象
         * @param m       被代理方法
         * @param proceed 如果代理接口，此参数为null，如果代理类，此参数为父类的方法
         * @param args    方法参数
         */
        @Override
        public Object invoke(Object self, Method m, Method proceed, Object[] args) throws Throwable {
            System.out.println("唱nm , 燃起来了");
            Object ret = proceed.invoke(self, args);    // 调用父类的sing方法
            System.out.println("唱nm , 燃起来了");
            return ret;
        }
    }
}
